package com.eian.boot.metrics.model;

import lombok.Data;
import lombok.experimental.Accessors;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 性能监控记录
 *
 * @author alex.meng
 */
@Data
@Accessors(chain = true)
public class PerformanceRecord {

    /**
     * 记录ID
     */
    private String id;

    /**
     * 监控名称
     */
    private String name;

    /**
     * 类名
     */
    private String className;

    /**
     * 方法名
     */
    private String methodName;

    /**
     * 方法签名
     */
    private String methodSignature;

    /**
     * 开始时间
     */
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    private LocalDateTime endTime;

    /**
     * 执行时长（毫秒）
     */
    private long duration;

    /**
     * 是否成功
     */
    private boolean success;

    /**
     * 异常信息
     */
    private String errorMessage;

    /**
     * 异常类型
     */
    private String errorType;

    /**
     * 方法参数
     */
    private List<Object> args;

    /**
     * 返回值
     */
    private Object result;

    /**
     * 业务标签
     */
    private List<String> tags;

    /**
     * 线程信息
     */
    private ThreadInfo threadInfo;

    /**
     * 内存信息
     */
    private MemoryInfo memoryInfo;

    /**
     * 扩展属性
     */
    private Map<String, Object> attributes;

    @Data
    @Accessors(chain = true)
    public static class ThreadInfo {
        /**
         * 线程ID
         */
        private long threadId;

        /**
         * 线程名称
         */
        private String threadName;

        /**
         * 是否为虚拟线程
         */
        private boolean virtual;
    }

    @Data
    @Accessors(chain = true)
    public static class MemoryInfo {
        /**
         * 执行前内存使用量（字节）
         */
        private long beforeMemory;

        /**
         * 执行后内存使用量（字节）
         */
        private long afterMemory;

        /**
         * 内存变化量（字节）
         */
        private long memoryDelta;

        /**
         * 最大内存（字节）
         */
        private long maxMemory;

        /**
         * 总内存（字节）
         */
        private long totalMemory;

        /**
         * 可用内存（字节）
         */
        private long freeMemory;
    }
}
